import {
  ModalTypes
} from './typing.js';

/**
 * 希望有一个工厂通过传入的状态来自动实例化相应的类
 * 希望父类Modal有一个模块里面有一些公共的方法，属性，静态工具
 */
class Modal {
  constructor(status) {
    this.status = status;
  }

  //相当于getter 进行拦截
  //根据状态获取类名
  get className() {
    let classStr = 'modal';
    switch (this.status) {
      case ModalTypes.SUCCESS:
        classStr += ' success';
        break;
      case ModalTypes.WARNING:
        classStr += ' warning';
        break;
      case ModalTypes.ERROR:
        classStr += ' error';
        break;
      default:
        break;
    }
    return classStr;
  }

  //静态工具

  /**
   * 避免modalFactory.create()乱传参数
   * @param {*} types ModalTypes
   * @param {*} status 用户create是传入的参数(button节点上自定义属性data-status)
   * @returns true/false
   */
  static checkStatusIsExist(types, status) {
    //检查参数是否存在于自定义的类型
    for (let k in types) {
      //存在时说明是存在返回true
      if (types[k] === status) {
        return true;
      }
    }

    //不存在时返回false
    return false;
  }
}


/**
 * ModalFactory对每种状态内部属性加工，或者是每种状态的功能拓展，所以区别了3个不同的类去完成
 * Success Warning Errow
 */
class SuccessModal extends Modal {
  constructor(title) {
    //向父类传值
    super(ModalTypes.SUCCESS);
    this.title = '成功：' + title;
  }

  //各自的拓展方法
  //...
}

class WarningModal extends Modal {
  constructor(title) {
    //向父类传值
    super(ModalTypes.WARNING);
    this.title = '警告：' + title;
  }

  //各自的拓展方法
  //...
}

class ErrorModal extends Modal {
  constructor(title) {
    //向父类传值
    super(ModalTypes.ERROR);

    this.title = '失败：' + title;
  }

  //各自的拓展方法
  //...
}

class ModalFactory {
  constructor(dom) {
    this.dom = dom;
  }

  //实例化方法
  /**
   * 实例化创建相应的类,且修改标题内容和样式
   * @param {*} title 标题
   * @param {*} status dom标签自定义属性的状态 
   */
  create(title, status) {
    const statusIsExist = Modal.checkStatusIsExist(ModalTypes, status);
    const dom = this.dom;
    let modal = null;

    //说明传错内容
    if (!statusIsExist) {
      throw new Error('Modal type is incorrect.');
    }


    switch (status) {
      case ModalTypes.SUCCESS:
        modal = new SuccessModal(title);
        break;
      case ModalTypes.WARNING:
        modal = new WarningModal(title);
        break;
      case ModalTypes.ERROR:
        modal = new ErrorModal(title);
        break;
      default:
        break;
    }

    //获取标题节点 并将父类Modal里的title属性内容写入文本里
    dom.getElementsByTagName('header')[0].innerText = modal.title;

    //访问父类Modal里的className属性会触发拦截 并修改各自样式
    dom.className = modal.className;
  }
}

export default ModalFactory;